﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Siser.Web.Models;
using Siser.Web.Models.JsonResponses;
using Siser.Web.Shared;

namespace Siser.Web.Controllers
{ 
    public class InstalacionController : Controller
    {
        private SiserEntities db = new SiserEntities();

        //
        // GET: /Instalacion/

        public ViewResult Index()
        {
            var instalaciones = db.Instalaciones.Include(i => i.Planta).Include(i => i.Encargado);
            return View(instalaciones.ToList());
        }

        //
        // GET: /Instalacion/Details/5

        public ViewResult Details(int id)
        {
            Instalacion instalacion = db.Instalaciones.Find(id);
            return View(instalacion);
        }

        //
        // GET: /Instalacion/Create

        public ActionResult Create()
        {
            ViewBag.PlantaId = new SelectList(db.Plantas, "Id", "Nombre");
            var empleado = (
                               from e in db.Empleados
                               join u in db.Usuarios on e.Id equals u.EmpleadoId
                               where u.Vigencia == true
                               select e
                          ).ToList();
            ViewBag.EncargadoId = new SelectList(empleado, "Id", "Nombre");
            return View();
        } 

        //
        // POST: /Instalacion/Create

        [HttpPost]
        public ActionResult Create(Instalacion instalacion)
        {
            if (ModelState.IsValid)
            {
                db.Instalaciones.Add(instalacion);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            ViewBag.PlantaId = new SelectList(db.Plantas, "Id", "Nombre", instalacion.PlantaId);

            var empleado = (
                              from e in db.Empleados
                              join u in db.Usuarios on e.Id equals u.EmpleadoId
                              where u.Vigencia == true
                              select e
                         ).ToList();

            ViewBag.EncargadoId = new SelectList(empleado, "Id", "Nombre", instalacion.EncargadoId);
            return View(instalacion);
        }
        
        //
        // GET: /Instalacion/Edit/5
 
        public ActionResult Edit(int id)
        {
            Instalacion instalacion = db.Instalaciones.Find(id);
            ViewBag.PlantaId = new SelectList(db.Plantas, "Id", "Nombre", instalacion.PlantaId);
            ViewBag.EncargadoId = new SelectList(db.Empleados, "Id", "Nombre", instalacion.EncargadoId);
            return View(instalacion);
        }

        //
        // POST: /Instalacion/Edit/5

        [HttpPost]
        public ActionResult Edit(Instalacion instalacion)
        {
            if (ModelState.IsValid)
            {
                db.Entry(instalacion).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.PlantaId = new SelectList(db.Plantas, "Id", "Nombre", instalacion.PlantaId);
            ViewBag.EncargadoId = new SelectList(db.Empleados, "Id", "Nombre", instalacion.EncargadoId);
            return View(instalacion);
        }

        //
        // GET: /Instalacion/Delete/5
 
        public ActionResult Delete(int id)
        {
            Instalacion instalacion = db.Instalaciones.Find(id);
            return View(instalacion);
        }

        //
        // POST: /Instalacion/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            //verifica que no tenga asociado un equipo.
            var listaInstaEquipo = (from e in db.Equipos
                                    join i in db.Instalaciones on e.InstalacionId equals i.Id
                                    where i.Id == id
                                    select e).ToList();

            if (listaInstaEquipo.Count == 0)//si no tiene equipo-Pieza asociada se procede a eliminar.
            {
                Instalacion instalacion = db.Instalaciones.Find(id);
                db.Instalaciones.Remove(instalacion);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            else //si tiene equipo asociado se envia mensaje.
            {
                TempData["texto5"] = "Debe eliminar el Equipo asociado a la Instalación para poder eliminar.";
                return View("Delete");
            }


        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        public ActionResult SearchByMap()
        {
            return View();
        }

        public ActionResult Search(int? region = null, int? empresa = null, int? planta = null)
        {


            var query = from i in db.Instalaciones
                        join e in db.Empleados on i.EncargadoId equals e.Id
                        join u in db.Usuarios on e.Id equals u.EmpleadoId
                        join r in db.Roles on u.RolId equals r.Id
                        where (i.Planta.Id == planta || planta == null)
                           && (i.Planta.Region.Id == region || region == null)
                           && (i.Planta.Empresa.Id == empresa || empresa == null)
                           && (r.Id==10 || r.Id==13)
                        select i;

            return View(query);
        }

        public ActionResult SearchAmbiental(int? region = null, int? empresa = null, int? planta = null)
        {


            var query = from i in db.Instalaciones
                        join e in db.Empleados on i.EncargadoId equals e.Id
                        join u in db.Usuarios on e.Id equals u.EmpleadoId
                        join r in db.Roles on u.RolId equals r.Id
                        where (i.Planta.Id == planta || planta == null)
                           && (i.Planta.Region.Id == region || region == null)
                           && (i.Planta.Empresa.Id == empresa || empresa == null)
                           && (r.Id == 11)
                        select i;

            return View(query);
        }

        public ActionResult Map(int id)
        {
            Instalacion instalacion = new Instalacion();

            Instalacion i = db.Instalaciones.Find(id);
            var equipos = (from ue in db.UsuariosEquipos
                           join u in db.Usuarios on ue.UsuarioId equals u.Id
                           where u.Vigencia == true
                              && u.Nombre == HttpContext.User.Identity.Name
                              && ue.Equipo.InstalacionId == id
                              && ue.Equipo.Vigencia == true
                           select ue.Equipo).ToList();

            List<Pieza> detectores = new List<Pieza>();

            foreach (var equipo in equipos)
            {
                equipo.Detectores = new List<Pieza>();

                var d = (from p in db.Piezas
                         join ep in db.EquiposPiezas on p.Id equals ep.PiezaId
                         where ep.EquipoId == equipo.Id
                            && p.Vigencia == true
                            && p.TipoPieza.Nombre == "Detector"
                            && ep.FechaFin == null
                         select p).ToList();

                equipo.Detectores.AddRange(d);
            }

            instalacion.Id = i.Id;
            instalacion.NombreImagen = i.NombreImagen;
            instalacion.Nombre = i.Nombre;
            instalacion.Equipos = equipos;

            return View(instalacion);
        }

        [HttpPost]
        public JsonResult GetInstalaciones()
        {
            var instalacionJson = (from i in db.Instalaciones
                                   join x in
                                       (from e in db.Equipos
                                        join ue in db.UsuariosEquipos on e.Id equals ue.Equipo.Id
                                        join u in db.Usuarios on ue.Usuario.Id equals u.Id
                                        where e.Vigencia == true
                                           && u.Vigencia == true
                                           && u.Nombre == HttpContext.User.Identity.Name
                                        select e) on i.Id equals x.InstalacionId
                                   select new JsonDataMap()
                                   {
                                       Id = i.Id,
                                       Latitud = i.Latitud,
                                       Longitud = i.Longitud,
                                       Nombre = i.Nombre,
                                       Tipo = "INS",
                                       Controller = "Instalacion",
                                       Action = "Map",
                                       Parametro = i.Id,
                                       NivelAlarma = ""
                                   }).Distinct().ToList();

            for (int i = 0; i < instalacionJson.Count; i++)
            {
                instalacionJson[i].NivelAlarma = SystemAlarm.GetAlarmLevelByInstalacion(HttpContext.User.Identity.Name, instalacionJson[i].Id);
                instalacionJson[i].Id = null;
            }

            return Json(instalacionJson);
        }
    }
}